import 'dart:io';

/// future 是一个指定类型的异步操作结果。(虽然我也不知道这是啥意思)
/// 用法有两步，第一:将函数放入future中，并等待执行。
/// 第二: 注册then回调，then回调会在 future中的函数执行完毕后回调。
/// (then操作实际上返回的也是一个future，但是这个是马上执行的)

main()  {
  Future((){
    for(int i =0;i<10;i++){
      sleep(const Duration(seconds: 1));
      print(i);
    }
  });
  sleep(const Duration(seconds: 5));
  print("随便打印点东西");
}

class FutureStudyTest {
  void simple1() {
    Future f1 = Future(() {
      print("我是第一个");
    });
    f1.then((_) => print("f1 then"));
    print("我是main");
  }

  void simple2() {
    var future1 = Future.delayed(const Duration(milliseconds: 200), () {
      print("我是延迟的Future");
    });
    future1.then((value) => print("延迟结束"));
    var future = Future.value("我是Future");
    future.then((value) => print(value));
  }

  void simple3() {
    Future f1 = Future(() => null);
    Future f2 = Future(() => null);
    Future f3 = Future(() => {print("创建f3")});
    f3.then((value) => print("我是f3"));
    f2.then((value) => print("我是f2"));
    f1.then((value) => print("我是f1"));
  }

  void simple4() {
    Future f1 = Future(() => null);
    Future f2 = Future(() => null);
    Future f3 = Future(() => {print("创建f3")});
    f3.then((_) => print("我是f3"));

    f2.then((_) {
      print("我是f2");
      Future(() => print("我是一个新的"));
      f1.then((_) {
        print("我是f1");
      });
    }).then((value) => print("我还是f2"));
  }

  void simple5() {
    var future = Future(() {
      print("执行操作");
    }).then((value) => {print("这里是处理结果")});
  }

  void asyncTest() async {
    var future1 = Future.delayed(Duration(milliseconds: 2000), () {
      return "我是第一个";
    });
    var future2 = Future(() {
      return "我是第二个";
    });
    future2.then((value) => print("哦哦哦"));
    print("开始了${DateTime.now()}");
    print("${await future1}:${await future2}");
    print("结束了:${DateTime.now()}");
  }

  getAString() async {
    return Future.delayed(const Duration(milliseconds: 10), () {
      var list = ["开始延时任务"];
      for (int i = 0; i < 100; i++) {
        list.add("$i:延时任务");
      }
      return list;
    }).then((value) {
      value.forEach((element) {
        print(element);
      });
    });
  }

  printString() async {
    Future.delayed(Duration(milliseconds: 3000), () {
      return "延时任务1";
    }).then((value) => {print(value)});
    Future.delayed(Duration(milliseconds: 2000), () {
      return "延时任务2";
    }).then((value) => {print(value)});
    Future.delayed(Duration(milliseconds: 1000), () {
      return "延时任务3";
    }).then((value) => {print(value)});
  }
}
